#ifndef _WX_GTKANIMATEH__
#define _WX_GTKANIMATEH__

typedef struct _GdkPixbufAnimation GdkPixbufAnimation;
typedef struct _GdkPixbufAnimationIter GdkPixbufAnimationIter;

class wxAnimation : public wxAnimationBase {
  public:
    wxAnimation( const wxString &name, wxAnimationType type = wxANIMATION_TYPE_ANY )
      : m_pixbuf( NULL ) { LoadFile( name, type ); }
    wxAnimation( GdkPixbufAnimation *p = NULL );
    wxAnimation( const wxAnimation& );
    ~wxAnimation() { UnRef(); }
    wxAnimation& operator= ( const wxAnimation& );
    virtual bool IsOk() const { return m_pixbuf != NULL; }
    virtual unsigned int GetFrameCount() const { return 0; }
    virtual wxImage GetFrame( unsigned int frame ) const;
    virtual int GetDelay( unsigned int ( frame ) ) const { return 0; }
    virtual wxSize GetSize() const;
    virtual bool LoadFile( const wxString &name, wxAnimationType type = wxANIMATION_TYPE_ANY );
    virtual bool Load( wxInputStream &stream, wxAnimationType type = wxANIMATION_TYPE_ANY );
  public:
    GdkPixbufAnimation *GetPixbuf() const { return m_pixbuf; }
    void SetPixbuf( GdkPixbufAnimation* p );
  protected:
    GdkPixbufAnimation *m_pixbuf;
  private:
    void UnRef();
    typedef wxAnimationBase base_type;
    DECLARE_DYNAMIC_CLASS( wxAnimation )
};

#define wxAN_FIT_ANIMATION       0x0010

class wxAnimationCtrl: public wxAnimationCtrlBase {
  public:
    wxAnimationCtrl() { Init(); }
    wxAnimationCtrl( wxWindow *parent, wxWindowID id, const wxAnimation& anim = wxNullAnimation,
                     const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
                     long style = wxAC_DEFAULT_STYLE, const wxString& name = wxAnimationCtrlNameStr ) {
      Init();
      Create( parent, id, anim, pos, size, style, name );
    }
    void Init();
    bool Create( wxWindow *parent, wxWindowID id, const wxAnimation& anim = wxNullAnimation,
                 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
                 long style = wxAC_DEFAULT_STYLE, const wxString& name = wxAnimationCtrlNameStr );

    ~wxAnimationCtrl();
  public:     // event handler
    void OnTimer( wxTimerEvent & );
  public:     // public API
    virtual bool LoadFile( const wxString& filename, wxAnimationType type = wxANIMATION_TYPE_ANY );
    virtual void SetAnimation( const wxAnimation &anim );
    virtual wxAnimation GetAnimation() const { return wxAnimation( m_anim ); }
    virtual bool Play();
    virtual void Stop();
    virtual bool IsPlaying() const;
    bool SetBackgroundColour( const wxColour &colour );
  protected:
    virtual void DisplayStaticImage();
    virtual wxSize DoGetBestSize() const;
    void FitToAnimation();
    void ClearToBackgroundColour();
    void ResetAnim();
    void ResetIter();
  protected:      // internal vars
    GdkPixbufAnimation *m_anim;
    GdkPixbufAnimationIter *m_iter;
    wxTimer m_timer;
    bool m_bPlaying;
  private:
    typedef wxAnimationCtrlBase base_type;
    DECLARE_DYNAMIC_CLASS( wxAnimationCtrl )
    DECLARE_EVENT_TABLE()
};

#endif // _WX_GTKANIMATEH__
